package com.pe.pgn.clubpgn.dao.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.VentaDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbEstacion;
import com.pe.pgn.clubpgn.domain.ClpbProducto;
import com.pe.pgn.clubpgn.domain.ClpmPromocionConsumo;
import com.pe.pgn.clubpgn.domain.ClpmVenta;
import com.pe.pgn.clubpgn.domain.beans.BNClientesPersona;
import com.pe.pgn.clubpgn.domain.beans.BNTipoVentaManual;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

/**
 * @author Edwin Farfan
 */

@SuppressWarnings("unchecked")
@Repository("ventaDao")
public class VentaDaoImpl extends GenericDaoHibernate<ClpmVenta, Long> implements VentaDao {

	JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
		}

	private VentaDaoImpl() {
		super(ClpmVenta.class);
	}

	public List<ClpmVenta> obtenerVentas(){
	
		Criteria criteria = DetachedCriteria.forClass(ClpmVenta.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());
	
		criteria.setMaxResults(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		criteria.add(Restrictions.eq("stVenta", CLPConstantes.VENTA_ACTIVA));
		criteria.addOrder(Order.desc("id"));
	
		return criteria.list(); 
	}
	
	public List<ClpmVenta> obtenerVentasActivas(){
		String strFechaMax = obtenerMaximaFechaVenta();		
		
		StringBuffer query = new StringBuffer();
		
		
		query.append(" select * from (");
		query.append(" select "); 
		query.append(" venta.id as id,");
		query.append(" venta.co_recibo as coRecibo, ");
		query.append(" venta.co_code_estacion as coCodeEstacion, ");
		query.append(" estacion.de_estacion as deEstacion, ");
		query.append(" upper(cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno) clientePersona ,");
		query.append(" venta.de_placa as dePlaca, ");
		query.append(" to_char(cast(venta.da_fecha_venta as date), '"+CLPConstantes.DATE_PATTERN+"') as fechaVenta, ");
		query.append(" to_char(CAST(venta.da_fecha_creacion AS DATE), '"+CLPConstantes.DATE_PATTERN+"') as fechaCreacion, ");
		query.append(" venta.va_precio_venta as vaPrecioVenta ");
		
		query.append(" from clpm_venta venta ");
		
		query.append(" left join clpb_cliente_persona cliente  on cliente.id= venta.clpb_cliente_persona ");
		query.append(" left join clpb_estacion estacion on estacion.co_codigo_cofide = venta.co_code_estacion ");
		
		query.append(" where 1 = 1 ");
		query.append(" and st_venta='"+CLPConstantes.VENTA_MANUAL+"' ");
		query.append(" and st_online	='"+CLPConstantes.ST_OFFLINE+"' ");
		
		if(StringUtils.isNotBlank(strFechaMax)){
			query.append(" and trim(venta.da_fecha_venta)  = to_date('"+strFechaMax+"','dd/MM/yyyy')  ");
		}		
		
		query.append(" GROUP BY ");
		query.append(" venta.id , ");
		query.append(" venta.co_recibo , ");
		query.append(" venta.co_code_estacion , ");
		query.append(" estacion.de_estacion , ");
		query.append(" upper(cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno) ,");		
		query.append(" venta.de_placa , ");
	    query.append(" TO_CHAR(CAST(venta.da_fecha_venta AS DATE), 'dd/MM/yyyy') , ");
	    query.append(" to_char(CAST(venta.da_fecha_creacion AS DATE), 'dd/MM/yyyy') , ");
	    query.append(" venta.va_precio_venta ");		
		query.append(" order by venta.co_recibo desc,upper(cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno) asc, venta.de_placa asc");
		query.append(" ) where rownum <= ").append(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		
		System.out.println("*** VentaDaoImpl.obtenerVentasActivas() --> "+query.toString());
		return findListOfBeans(query.toString(), null, ClpmVenta.class);
	}
	
	public List<Map<String,Object>> busquedaClientes(String nroDocumento, String nombres,String deCodigoTarjeta){
		
		StringBuffer query = new StringBuffer();		
		query.append(" select cliente.id as  id, ");
		query.append("  tarjeta.id as idTarjeta, ");
		query.append(" tarjeta.co_codigo_tarjeta_persona codigoTarjeta, ");
		query.append(" upper(cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno) as nombre, ");
		query.append(" cliente.co_code_numero_documento as documento ");
		query.append(" from clpb_cliente_persona cliente ");
		query.append(" left join clpb_tarjeta_persona tarjeta on cliente.id= tarjeta.co_cliente_persona ");
		query.append(" where  ");
		query.append(" cliente.st_cliente_persona='"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" and tarjeta.st_tarjeta_persona='"+CLPConstantes.ST_VERDADERO+"'");

		if(StringUtils.isNotBlank(nroDocumento))
			query.append(" and cliente.co_code_numero_documento like ('%"+nroDocumento.trim()+"%') ");
	
		if(StringUtils.isNotBlank(nombres))
			query.append(" and upper(trim(cliente.de_nombre)||' '|| trim(cliente.de_ape_paterno)||' '||trim(cliente.de_ape_materno)) like upper('%"+nombres.trim()+"%') ");
		
		if(StringUtils.isNotBlank(deCodigoTarjeta))
			query.append(" and tarjeta.co_codigo_tarjeta_persona  like ('%"+deCodigoTarjeta.trim()+"%') ");		
		
	return  jdbcTemplate.queryForList(query.toString());
	}


	public ClpmVenta obtenerVenta(Long id){

		ClpmVenta venta = get(id);
		
		//setear los campos de las fechas
		if(venta.getDaFechaApertura()!=null)
			venta.setFechaApertura(CalendarUtil.calendarToString(CLPConstantes.FORMATO_FECHA_CLUB_PGN_MINUTO, venta.getDaFechaApertura()));
		
		if(venta.getDaFechaLecturaInicio()!=null)
		venta.setFechaLecturaInicio(CalendarUtil.calendarToString(CLPConstantes.FORMATO_FECHA_CLUB_PGN_MINUTO, venta.getDaFechaLecturaInicio()));
		
		if(venta.getDaFechaLecturaFin()!=null)
		venta.setFechaLecturaFin(CalendarUtil.calendarToString(CLPConstantes.FORMATO_FECHA_CLUB_PGN_MINUTO, venta.getDaFechaLecturaFin()));
		
		if(venta.getDaFechaProceso()!=null)
		venta.setFechaProceso(CalendarUtil.calendarToString(CLPConstantes.DATE_PATTERN,venta.getDaFechaProceso()));
		
		if(venta.getDaFechaVenta()!=null)
		venta.setFechaVenta(CalendarUtil.calendarToString(CLPConstantes.FORMATO_FECHA_CLUB_PGN,venta.getDaFechaVenta()));
		
		return venta;
	}
	
	public List<ClpbProducto> listadoProductos(){
		Criteria criteria = DetachedCriteria.forClass(ClpbProducto.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());
	
		criteria.setMaxResults(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		criteria.add(Restrictions.eq("stProducto", Boolean.TRUE));
		criteria.addOrder(Order.desc("id"));
	
		List<ClpbProducto> lista = criteria.list(); 
		
	return lista;
		
	}
	
	public List<ClpmPromocionConsumo> listadoPromocionConsumo(){
		
		Criteria criteria = DetachedCriteria.forClass(ClpmPromocionConsumo.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());
	
		criteria.setMaxResults(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		criteria.add(Restrictions.eq("stPromocionConsumo", Boolean.TRUE));
		criteria.addOrder(Order.desc("id"));
	
		List<ClpmPromocionConsumo> lista = criteria.list(); 
		
	return lista;
	}
	
	public Map guardarVenta(ClpmVenta venta, boolean anulada) throws Exception{
		
		Map mapSalida = new HashMap();
		if(venta.getId() == null){
			
			venta.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			venta.setDaFechaCreacion(Calendar.getInstance());
			
			//setear campos de fecha
			venta.setDaFechaApertura(CalendarUtil.stringToCalendar(CLPConstantes.FORMATO_FECHA_CLUB_PGN_MINUTO,venta.getFechaApertura()));
			venta.setDaFechaLecturaInicio(CalendarUtil.stringToCalendar(CLPConstantes.FORMATO_FECHA_CLUB_PGN_MINUTO, venta.getFechaLecturaInicio()));
			venta.setDaFechaLecturaFin(CalendarUtil.stringToCalendar(CLPConstantes.FORMATO_FECHA_CLUB_PGN_MINUTO, venta.getFechaLecturaFin()));
			venta.setDaFechaProceso(CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, venta.getFechaProceso()));
			venta.setDaFechaVenta(CalendarUtil.stringToCalendar(CLPConstantes.FORMATO_FECHA_CLUB_PGN_MINUTO, venta.getFechaVenta()));
		}
		else{
			venta.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			venta.setDaFechaModificacion(Calendar.getInstance());
		}

		if(anulada){
			//TODO:confirmar si es que esto ya no va ir aqui
			venta.setStModificado(CLPConstantes.VENTA_ST_MODIFICADO);
			
		}
		
		//frk: validando si es una tarjeta valida
		Long coClientePersona = null;
		String deFechaInscripcion = "";
		String coCodigoTarjetaPersona = venta.getCoCodigoTarjetaPersona();
		if(StringUtils.isNotBlank(coCodigoTarjetaPersona)){
			Map map = validaTarjetaPersona(venta);
			if(map.get("coClientePersona") == null){
				mapSalida.put("error", "tarjeta_invalid");
				return mapSalida; 
			}else{
				
				deFechaInscripcion = String.valueOf(map.get("fechaInscripcion")).trim();
				coClientePersona = new Long(map.get("coClientePersona").toString());
				if(venta.getIdClientePersona() == null){
					venta.setIdClientePersona(coClientePersona);
				}
			}
		}
				
		boolean isUniq = validaUnicoRegistro(venta);
		if(!isUniq){
			mapSalida.put("error", "registro_duplicado");
			return mapSalida; 
		}		
		
		venta.setStVenta(CLPConstantes.VENTA_MANUAL);
		venta.setStOnline(CLPConstantes.ST_OFFLINE);
		getHibernateTemplate().saveOrUpdate(venta);		
		getHibernateTemplate().flush();
		
		//Validaciones para acumulacion de puntos, primero se verifica que el cliente este afiliado
		boolean acumulaPuntos = false;
		if(!deFechaInscripcion.equals("") && 
		   !deFechaInscripcion.equalsIgnoreCase("null")){
			acumulaPuntos = true;
		}		
		
		List<Map<String, Object>> listaProgramas = obtenerListaProgramasPorCliente(coClientePersona.toString());
		if(ValidationUtil.validateList(listaProgramas)){
			for(Iterator<Map<String, Object>> iter = listaProgramas.iterator(); iter.hasNext(); ){
				
				Map<String, Object> programa = iter.next();
				String stAcumulaPuntos = String.valueOf(programa.get("stAcumulaPuntos"));
				if(stAcumulaPuntos.equalsIgnoreCase(CLPConstantes.ST_FALSO) && acumulaPuntos){
					acumulaPuntos = false;
				}
			}
		}
		
		//llamando al stored procedure sp_acumular_puntos
		if(StringUtils.isNotBlank(coCodigoTarjetaPersona) && acumulaPuntos){
			acumularPuntosPorCliente(venta);
		}
		
		mapSalida.put("success", "true");
		return mapSalida;
	}
	
	
	public List<Map<String, Object>> obtenerListaProgramasPorCliente(String idClientePersona){
		
		StringBuffer query = new StringBuffer();
		query.append("select p.id as coPrograma, ");
		query.append("		p.de_programa as dePrograma, ");		
		query.append("		p.co_unidad_medida coUnidadMedida, ");
		query.append("		p.st_acum_ptos as stAcumulaPuntos, ");
		query.append("		um.de_unidad_medida as deUnidadMedida, ");
		query.append("		um.de_simbolo as deSimbolo, ");
		query.append("		cp.da_fecha_creacion as daFechaCreacion, ");
		query.append("		max(pl.da_fecha_fin) as maxDaFechaLiquidacion ");
		query.append("	from clpr_cliente_programa cp ");
		query.append("		join clpb_programa p on cp.clpb_programa = p.id");
		query.append(" 		join clpb_producto pr on p.co_unidad_medida = pr.co_unidad_medida ");
		query.append(" 		join clpd_unidad_medida um on p.co_unidad_medida = um.id and pr.co_unidad_medida = um.id");
		query.append("		left outer join clpr_periodo_liquidacion pl on cp.clpb_programa = pl.co_programa ");
		query.append("	where cp.clpb_cliente_persona = ").append(idClientePersona);
		query.append("		and cp.st_cliente_programa = '").append(CLPConstantes.ST_VERDADERO).append("' ");
		query.append("		and p.st_programa = '").append(CLPConstantes.ST_VERDADERO).append("' ");
		query.append("		and p.st_imprime_mensaje = '").append(CLPConstantes.ST_VERDADERO).append("' ");
		query.append("		and pr.st_producto = '").append(CLPConstantes.ST_VERDADERO).append("' ");
		query.append("	group by p.id, p.de_programa,um.de_unidad_medida, um.de_simbolo,p.co_unidad_medida,p.st_acum_ptos,cp.da_fecha_creacion ");
		query.append("	order by cp.da_fecha_creacion  asc ");

		List<Map<String, Object>> list = findListOfMaps(query.toString(), null);
		return list;
	}

	private boolean validaUnicoRegistro(ClpmVenta venta) {

		StringBuffer query = new StringBuffer();
		String coCodeEstacion = venta.getCoCodeEstacion();
		String coNumero = venta.getCoNumero();
		String coSerie  = venta.getCoSerie();
		
		query.append(" select ");
		query.append(" count(id) ");
		query.append(" from clpm_venta ");
		query.append(" where co_code_estacion = '").append(coCodeEstacion).append("'");
		query.append(" and co_serie  = '").append(coSerie).append("'");
		query.append(" and co_numero = '").append(coNumero).append("'");
		
		if(venta.getId() != null){
			query.append(" id != ").append(venta.getId());
		}
		
		int count = jdbcTemplate.queryForInt(query.toString());		
		if(count > 0){
			return false;
		}
		return true;
	}

	private Map validaTarjetaPersona(ClpmVenta venta) {

		String codeTarjeta = venta.getCoCodigoTarjetaPersona();
		StringBuffer query = new StringBuffer();
		Map map = new HashMap();
		
		query.append(" select ");
		query.append(" cp.id, ");
		query.append(" to_char(cast(cp.da_fecha_inscripcion as date), '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_BD+"') as fechaInscripcion, ");
		query.append(" tp.co_cliente_persona as coClientePersona  ");		
		query.append(" from clpb_tarjeta_persona tp ");
		query.append(" inner join clpb_cliente_persona cp ");
		query.append(" 	on cp.id = tp.co_cliente_persona ");	
		query.append(" where 1 = 1 ");
		query.append(" 	and trim(tp.co_codigo_tarjeta_persona) = '").append(codeTarjeta.trim()).append("'");
		query.append(" 	and cp.st_cliente_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 	and tp.st_tarjeta_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		List list = findListOfBeans(query.toString(), null, BNClientesPersona.class);
		if(list != null && !list.isEmpty()){
			
			BNClientesPersona bean = (BNClientesPersona)list.get(0);
			map.put("coClientePersona", bean.getCoClientePersona());
			map.put("fechaInscripcion", bean.getFechaInscripcion());
		}
		
		return map;
	}
	

	public Map<String, Object> acumularPuntosPorCliente(ClpmVenta venta){

		SimpleJdbcCall spAcumularPuntos = new SimpleJdbcCall(jdbcTemplate)
		.withProcedureName("SP_ACUMULAR_PUNTOS");

		Map<String, Object> parametrosIngresoMap = new HashMap<String, Object>();
		parametrosIngresoMap.put("codeEstacion", venta.getCoCodeEstacion());
		parametrosIngresoMap.put("idCliente", venta.getIdClientePersona().toString());
		parametrosIngresoMap.put("fechaVenta", CalendarUtil.calendarToString(CLPConstantes.FORMATO_FECHA_CLUB_PGN, venta.getDaFechaVenta()));
		parametrosIngresoMap.put("cantidad", venta.getVaCantidad());
		parametrosIngresoMap.put("idVenta", venta.getId().toString());
	
		SqlParameterSource parametrosIngreso = new MapSqlParameterSource().addValues(parametrosIngresoMap);
		
		Map<String, Object> parametrosSalida = spAcumularPuntos.execute(parametrosIngreso);		
		return parametrosSalida;
	}
	
	
	public void eliminarVentaManual(ClpmVenta venta){
		
//		getHibernateTemplate().delete(venta);
//		getHibernateTemplate().flush();
		venta.setStModificado(CLPConstantes.VENTA_ST_MODIFICADO);
		
		//venta.setStVenta(CLPConstantes.VENTA_ELIMINADA); //preguntar si es asi
		venta.setStVenta(CLPConstantes.VENTA_INACTIVA);
		
		getHibernateTemplate().saveOrUpdate(venta);
		getHibernateTemplate().flush();
	}
	
	public List<ClpbEstacion> listadoEstaciones(){
		Criteria criteria = DetachedCriteria.forClass(ClpbEstacion.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());
	
		criteria.add(Restrictions.eq("stEstacion", Boolean.TRUE));
		criteria.addOrder(Order.desc("id"));
	
		List<ClpbEstacion> lista = criteria.list(); 
		
	return lista;
	}
	
	
	public List<ClpmVenta> busquedaVentas(String recibo, String fechaVentaInicio,String fechaVentaFin,String fechaCreacionInicio,String fechaCreacionFin, String estacion, String placa,
			 String deCliente,
			 String coCodigoTarjetaPersona,
			 String deNumeroDocumento){

		
		try{
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, fechaVentaInicio);
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, fechaVentaFin);
        }catch(Exception e){
        	//entra aca si el parametro dado no es una fecha
        	fechaVentaInicio = "";
        	fechaVentaFin 	= "";
        }
        
		try{
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, fechaCreacionInicio);
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, fechaCreacionFin);
        }catch(Exception e){
        	//entra aca si el parametro dado no es una fecha
        	fechaCreacionInicio = "";
        	fechaCreacionFin 	= "";
        }	
        
        
		StringBuffer sql= new StringBuffer();
		sql.append(" select "); 
		sql.append(" venta.id as id,");
		sql.append(" venta.clpm_promocion_consumo as idPromocionConsumo, ");
		sql.append(" venta.clpb_cliente_persona as idClientePersona, ");
		sql.append(" venta.co_codigo_tarjeta_persona as coCodigoTarjetaPersona, ");
		sql.append(" venta.clpb_cliente_empresa as idClienteEmpresa, ");
		sql.append(" venta.co_codigo_tarjeta_empresa as coCodigoTarjetaEmpresa, ");
		sql.append(" venta.clpb_producto as idProducto, ");
		sql.append(" venta.co_code_manguera as coCodeManguera, ");
		sql.append(" venta.co_code_cara as coCodeCara, ");
		sql.append(" venta.co_code_surtidor as coCodeSurtidor, ");
		sql.append(" venta.co_code_isla as coCodeIsla, ");
		sql.append(" venta.co_code_estacion as coCodeEstacion, ");
		sql.append(" estacion.de_estacion as deEstacion, ");
		sql.append(" venta.co_serie as coSerie, ");
		sql.append(" venta.co_numero as coNumero, ");
		sql.append(" venta.co_code_serial_impresora as coCodeSerialImpresora, ");
		sql.append(" venta.co_code_turno_horario as coCodeTurnoHorario, ");
		sql.append(" to_char(venta.da_fecha_venta, '"+CLPConstantes.DATE_PATTERN+"') as fechaVenta, ");
		sql.append(" to_char(venta.da_fecha_creacion, '"+CLPConstantes.DATE_PATTERN+"') as fechaCreacion, ");
		sql.append(" to_char(venta.da_fecha_proceso,'"+CLPConstantes.DATE_PATTERN+"') as fechaProceso, ");
		sql.append(" to_char(venta.da_fecha_apertura) as fechaApertura, ");
		sql.append(" to_char(venta.da_fecha_lectura_inicio) as fechaLecturaInicio, ");
		sql.append(" to_char(venta.da_fecha_lectura_fin) as fechaLecturaFin, ");
		sql.append(" venta.va_lectura_inicio as vaLecturaInicio, ");
		sql.append(" venta.va_lectura_final as vaLecturaFinal, ");
		sql.append(" venta.co_ruc as coRuc, ");
		sql.append(" venta.va_cantidad as vaCantidad, ");
		sql.append(" venta.va_precio_unitario as vaPrecioUnitario, ");
		sql.append(" venta.va_recaudo as vaRecaudo, ");
		sql.append(" venta.va_valor_venta as vaValorVenta, ");
		sql.append(" venta.va_impuesto as vaImpuesto, ");
		sql.append(" venta.va_precio_venta as vaPrecioVenta, ");
		sql.append(" venta.de_placa as dePlaca, ");
		sql.append(" venta.co_recibo as coRecibo, ");
		sql.append(" venta.co_recibo_anulado as coReciboAnulado, ");
		sql.append(" venta.st_venta as stVenta , ");
		sql.append(" venta.st_online as stOnline, ");
		sql.append(" venta.de_mensaje as deMensaje, ");
		sql.append(" venta.va_puntos as vaPuntos, ");
		sql.append(" venta.co_code_vale_credito as coCodeValeCredito, ");
		sql.append(" venta.co_code_vale_promocion as coCodePromocionConsumo, ");
		sql.append(" venta.co_code_vale_promocion as coCodeValePromocionConsumo, ");
		sql.append(" upper(cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno) clientePersona ");
		sql.append(" from clpm_venta venta");
		sql.append(" left join clpb_cliente_persona cliente  on cliente.id = venta.clpb_cliente_persona ");
		sql.append(" left join clpb_estacion estacion on estacion.co_codigo_cofide = venta.co_code_estacion ");
		sql.append(" where 1=1");
		sql.append(" and st_venta		='"+CLPConstantes.VENTA_MANUAL+"' ");
		sql.append(" and st_online	='"+CLPConstantes.ST_OFFLINE+"' ");

		if(StringUtils.isNotBlank(recibo))
			sql.append(" and upper(venta.co_Recibo) like upper('%"+recibo+"%') ");
		
		if(StringUtils.isNotBlank(estacion) && !(estacion.equals("-1")))
			sql.append(" and venta.co_code_estacion='"+estacion+"' ");
		
		if(StringUtils.isNotBlank(placa))
			sql.append(" and upper(venta.de_placa) like upper('%"+placa+"%') ");
		

			if (StringUtils.isNotBlank(fechaVentaInicio) && StringUtils.isNotBlank(fechaVentaFin)){
				sql.append(" and venta.da_fecha_venta >= to_date('"+fechaVentaInicio+"'," +
				"'"+CLPConstantes.DATE_PATTERN+"') and venta.da_fecha_venta <= to_date('"+fechaVentaFin+"','"+CLPConstantes.DATE_PATTERN+"'))");
			}
			
			if (StringUtils.isNotBlank(fechaCreacionInicio) && StringUtils.isNotBlank(fechaCreacionFin)){
				sql.append(" and (venta.da_fecha_creacion >= to_date('"+fechaCreacionInicio+"'," +
				"'"+CLPConstantes.DATE_PATTERN+"') and venta.da_fecha_creacion <= to_date('"+fechaCreacionFin+"','"+CLPConstantes.DATE_PATTERN+"'))");
			}			

			if(StringUtils.isNotBlank(deCliente))
				sql.append(" and upper(upper(cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno)) like upper('%"+deCliente+"%') ");			
			
			
			if(StringUtils.isNotBlank(coCodigoTarjetaPersona))
				sql.append(" and upper(upper(venta.co_codigo_tarjeta_persona)) like upper('%"+coCodigoTarjetaPersona+"%') ");			

			if(StringUtils.isNotBlank(deNumeroDocumento))
				sql.append(" and upper(upper(cliente.co_code_numero_documento)) like upper('%"+deNumeroDocumento+"%') ");			
			
			
			
		sql.append(" order by venta.co_recibo desc,upper(cliente.de_nombre||' '|| cliente.de_ape_paterno||' '||cliente.de_ape_materno) asc, venta.de_placa asc");		
		log.info("sql de la busqueda de las ventas:::::::::::::::::: " +sql.toString());
		
		List<ClpmVenta> listaClpmVenta= findListOfBeans(sql.toString(), null, ClpmVenta.class);
		
		if (!listaClpmVenta.isEmpty()){
			return listaClpmVenta;
		}		
		
		return null;

	}	

	private String obtenerMaximaFechaVenta(){
		
		String strFechaVenta = "to_char(cast(max(" +
		"venta.da_fecha_venta) as date), " +
		"'"+CLPConstantes.DATE_PATTERN+"')";
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" "+strFechaVenta+" as daFechaVenta ");
		query.append(" from clpm_venta venta ");
		
		query.append(" where 1 = 1 ");
		
		query.append(" and st_venta		='"+CLPConstantes.VENTA_MANUAL+"' ");
		query.append(" and st_online	='"+CLPConstantes.ST_OFFLINE+"' ");
		
		
		
		System.out.println("fecmax:" + query.toString());
		
		List list = findListOfMaps(query.toString(), null);
		if(!list.isEmpty()){
			Map map = (HashMap)list.get(0);
			return String.valueOf(map.get("daFechaVenta"));
		}
		return "";
	}

	public List<BNTipoVentaManual> obtenerTiposVentaManual() {
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" id as idTipo, ");
		query.append(" de_tipo_venta_manual as deTipo ");
		query.append(" from clpb_tipo_venta_manual ");
		query.append(" where st_tipo_venta_manual = '").append(CLPConstantes.ST_VERDADERO).append("'");

		return findListOfBeans(query.toString(), null, BNTipoVentaManual.class);
	}

	public List<ClpmVenta> listarVentasActivasPorCliente(String coClientePersona){

		StringBuffer query = new StringBuffer();		
		query.append(" select * from (");
		query.append(" 	select "); 
		query.append(" 	venta.id as id,");
		query.append(" 	venta.co_recibo as coRecibo, ");
		query.append(" 	venta.co_code_estacion as coCodeEstacion, ");
		query.append(" 	estacion.de_estacion as deEstacion, ");
		query.append(" 	venta.de_placa as dePlaca, ");
		query.append(" 	venta.co_codigo_tarjeta_persona as coCodigoTarjetaPersona, ");
		query.append(" 	to_char(cast(venta.da_fecha_venta as date), '"+CLPConstantes.DATE_PATTERN+"') as fechaVenta, ");
		query.append(" 	to_char(cast(venta.da_fecha_creacion as date), '"+CLPConstantes.DATE_PATTERN+"') as fechaCreacion, ");
		query.append(" 	venta.va_precio_venta as vaPrecioVenta, ");
		query.append(" 	venta.st_venta as stVenta, ");
		query.append(" 	venta.st_online as stOnline, ");
		query.append(" 	trim(venta.co_serie)||' - '|| trim(venta.co_recibo)||' - '||trim(venta.co_code_estacion) as deVenta ");
		
		query.append(" from clpm_venta venta ");		
		query.append(" left join clpb_estacion estacion on estacion.co_codigo_cofide = venta.co_code_estacion ");
		
		query.append(" where venta.clpb_cliente_persona = ").append(coClientePersona);
		query.append(" and venta.co_codigo_tarjeta_persona is not null ");
		
		query.append(" group by ");
		query.append(" 	venta.id,");
		query.append(" venta.co_recibo,");
		query.append(" venta.co_code_estacion,");
		query.append(" estacion.de_estacion,");
		query.append(" venta.de_placa,");
		query.append(" venta.co_codigo_tarjeta_persona ,");
		query.append(" TO_CHAR(CAST(venta.da_fecha_venta AS DATE), 'dd/MM/yyyy'),");
		query.append(" TO_CHAR(CAST(venta.da_fecha_creacion AS DATE), 'dd/MM/yyyy'),");
		query.append(" venta.va_precio_venta,");
		query.append(" venta.st_venta,");
		query.append(" venta.st_online,");
		query.append(" trim(venta.co_serie)");
		query.append(" ||' - '");
		query.append(" || trim(venta.co_recibo)");
		query.append(" ||' - '");
		query.append(" ||trim(venta.co_code_estacion)");
		query.append(" order by venta.id desc ");
		query.append(" ) where rownum <= ").append(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		
		System.out.println("*** VentaDaoImpl.listarVentasActivasPorCliente() --> "+query.toString());
		return findListOfBeans(query.toString(), null, ClpmVenta.class);
	}

	public List<ClpmVenta> buscarVentasActivasPorCliente(
			String coClientePersona, String coEstacionID,
			String iniFechaVentaID, String finFechaVentaID, String dePlacaID,
			String vaPrecioVentaIniID, String vaPrecioVentaFinID,
			String stOnlineID, String stVentaID) {

		StringBuffer query = new StringBuffer();		
		query.append(" 	select ");
		query.append(" 	venta.id as id,");
		query.append(" 	venta.co_recibo as coRecibo, ");
		query.append(" 	venta.co_code_estacion as coCodeEstacion, ");
		query.append(" 	estacion.de_estacion as deEstacion, ");
		query.append(" 	venta.de_placa as dePlaca, ");
		query.append(" 	venta.co_codigo_tarjeta_persona as coCodigoTarjetaPersona, ");
		query.append(" 	to_char(cast(venta.da_fecha_venta as date), '"+CLPConstantes.DATE_PATTERN+"') as fechaVenta, ");
		query.append(" 	to_char(cast(venta.da_fecha_creacion as date), '"+CLPConstantes.DATE_PATTERN+"') as fechaCreacion, ");
		query.append(" 	venta.va_precio_venta as vaPrecioVenta, ");
		query.append(" 	venta.st_venta as stVenta, ");
		query.append(" 	venta.st_online as stOnline, ");
		query.append(" 	trim(venta.co_serie)||' - '|| trim(venta.co_recibo)||' - '||trim(venta.co_code_estacion) as deVenta ");
		
		query.append(" from clpm_venta venta ");		
		query.append(" left join clpb_estacion estacion on estacion.co_codigo_cofide = venta.co_code_estacion ");
		
		query.append(" where venta.clpb_cliente_persona = ").append(coClientePersona);
		query.append(" and venta.co_codigo_tarjeta_persona is not null ");
		
		if(StringUtils.isNotBlank(coEstacionID) && !coEstacionID.equals("-1")){
			query.append(" and estacion.id = ").append(coEstacionID);
		}
		
		if(StringUtils.isNotBlank(iniFechaVentaID)){
			query.append(" and to_date(to_char(venta.da_fecha_venta,'"+CLPConstantes.DATE_PATTERN+"'),'"+CLPConstantes.DATE_PATTERN+"') >= to_date('").append(iniFechaVentaID).append("','"+CLPConstantes.DATE_PATTERN+"')");
		}
		
		if(StringUtils.isNotBlank(finFechaVentaID)){
			query.append(" and to_date(to_char(venta.da_fecha_venta,'"+CLPConstantes.DATE_PATTERN+"'),'"+CLPConstantes.DATE_PATTERN+"') <= to_date('").append(finFechaVentaID).append("','"+CLPConstantes.DATE_PATTERN+"')");
		}
		
		if(StringUtils.isNotBlank(dePlacaID)){
			query.append(" and trim(upper(venta.de_placa)) like upper('%").append(dePlacaID.trim()).append("%')");
		}
		
		if(StringUtils.isNotBlank(vaPrecioVentaIniID)){
			query.append(" and venta.va_precio_venta >= ").append(vaPrecioVentaIniID);
		}
		
		if(StringUtils.isNotBlank(vaPrecioVentaFinID)){
			query.append(" and venta.va_precio_venta <= ").append(vaPrecioVentaFinID);
		}
		
		if(StringUtils.isNotBlank(stOnlineID) && !stOnlineID.equals("-1")){
			query.append(" and venta.st_online = '").append(stOnlineID).append("'");
		}
		
		if(StringUtils.isNotBlank(stVentaID) && !stVentaID.equals("-1"))
		query.append(" and venta.st_venta = '").append(stVentaID).append("'");
		
		
		query.append(" group by ");
		query.append(" 	venta.id,");
		query.append(" venta.co_recibo,");
		query.append(" venta.co_code_estacion,");
		query.append(" estacion.de_estacion,");
		query.append(" venta.de_placa,");
		query.append(" venta.co_codigo_tarjeta_persona ,");
		query.append(" TO_CHAR(CAST(venta.da_fecha_venta AS DATE), 'dd/MM/yyyy'),");
		query.append(" TO_CHAR(CAST(venta.da_fecha_creacion AS DATE), 'dd/MM/yyyy'),");
		query.append(" venta.va_precio_venta,");
		query.append(" venta.st_venta,");
		query.append(" venta.st_online,");
		query.append(" trim(venta.co_serie)");
		query.append(" ||' - '");
		query.append(" || trim(venta.co_recibo)");
		query.append(" ||' - '");
		query.append(" ||trim(venta.co_code_estacion)");
		query.append(" order by venta.id desc ");
		
		System.out.println("*** VentaDaoImpl.buscarVentasActivasPorCliente() --> "+query.toString());
		return findListOfBeans(query.toString(), null, ClpmVenta.class);
	}

	public List<ClpbEstacion> listarEstaciones(boolean addItemDefault) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" id, de_estacion as deEstacion ");
		query.append(" from clpb_estacion ");
		query.append(" where st_estacion = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" order by id desc ");
		
		List<ClpbEstacion> listFinal = new ArrayList<ClpbEstacion>();
		List<ClpbEstacion> list = findListOfBeans(query.toString(), null, ClpbEstacion.class);
		
		if(addItemDefault){
			
			ClpbEstacion bean = new ClpbEstacion();
			bean.setId(new Long("-1"));
			bean.setDeEstacion("----");
			listFinal.add(bean);
		}
		
		listFinal.addAll(list);
		return listFinal;
	}

	public List<ClpmVenta> buscarVentas(int firstResult, int maxResults,
			String orderBy, boolean ascending, String[] filters) {
		
		String coClientePersona = "";
		String coEstacionID = "";
		String iniFechaVentaID = "";
    	String finFechaVentaID = "";
    	String dePlacaID = "";
    	String vaPrecioVentaIniID = "";
    	String vaPrecioVentaFinID = "";
    	String stOnlineID = "";
    	String stVentaID = "";
		
    	maxResults = maxResults + firstResult;
		if(filters != null && filters.length > 0){
			coClientePersona = filters[0] != null ? filters[0] : "";
			coEstacionID = filters[1] != null ? filters[1] : "";
			iniFechaVentaID = filters[2] != null ? filters[2] : "";
			finFechaVentaID = filters[3] != null ? filters[3] : "";
			dePlacaID = filters[4] != null ? filters[4] : "";
			vaPrecioVentaIniID = filters[5] != null ? filters[5] : "";
			vaPrecioVentaFinID = filters[6] != null ? filters[6] : "";
			stOnlineID = filters[7] != null ? filters[7] : "";
			stVentaID = filters[8] != null ? filters[8] : "";
		}
		
		List<Object> params = new ArrayList<Object>();
		StringBuffer query = new StringBuffer();
		
		if(firstResult > 0){
			query.append(" select * from ( ");
			query.append(" select slct.*,rownum rownum_ from ( ");
		}else{
			query.append(" select * from ( ");
		}
		
		query.append(" 	select ");
		query.append(" 	venta.id as id,");
		query.append(" 	venta.co_recibo as coRecibo, ");
		query.append(" 	venta.co_code_estacion as coCodeEstacion, ");
		query.append(" 	estacion.de_estacion as deEstacion, ");
		query.append(" 	venta.de_placa as dePlaca, ");
		query.append(" 	venta.co_codigo_tarjeta_persona as coCodigoTarjetaPersona, ");
		query.append(" 	to_char(cast(venta.da_fecha_venta as date), '"+CLPConstantes.DATE_PATTERN+"') as fechaVenta, ");
		query.append(" 	to_char(cast(venta.da_fecha_creacion as date), '"+CLPConstantes.DATE_PATTERN+"') as fechaCreacion, ");
		query.append(" 	venta.va_precio_venta as vaPrecioVenta, ");
		query.append(" 	venta.st_venta as stVenta, ");
		query.append(" 	venta.st_online as stOnline, ");
		query.append(" 	trim(venta.co_serie)||' - '|| trim(venta.co_recibo)||' - '||trim(venta.co_code_estacion) as deVenta ");
		
		query.append(" from clpm_venta venta ");		
		query.append(" left join clpb_estacion estacion on estacion.co_codigo_cofide = venta.co_code_estacion ");
		
		query.append(" where venta.clpb_cliente_persona = ").append(coClientePersona);
		query.append(" and venta.co_codigo_tarjeta_persona is not null ");
		query.append(" and venta.de_placa not in (");
		query.append(" 		select de_placa from clpb_vehiculo ");
		query.append("		where st_vehiculo = '"+CLPConstantes.ST_VERDADERO+"'");
		query.append("		and st_excluido_control_fraude = '"+CLPConstantes.ST_VERDADERO+"') ");
		
		if(StringUtils.isNotBlank(coEstacionID) && !coEstacionID.equals("-1")){
			query.append(" and estacion.id = ? ");
			params.add(coEstacionID);
		}
		
		if(StringUtils.isNotBlank(iniFechaVentaID)){
			query.append(" and to_date(to_char(venta.da_fecha_venta,'"+CLPConstantes.DATE_PATTERN+"'),'"+CLPConstantes.DATE_PATTERN+"') >= to_date(?,'"+CLPConstantes.DATE_PATTERN+"')");
			params.add(iniFechaVentaID);
		}
		
		if(StringUtils.isNotBlank(finFechaVentaID)){
			query.append(" and to_date(to_char(venta.da_fecha_venta,'"+CLPConstantes.DATE_PATTERN+"'),'"+CLPConstantes.DATE_PATTERN+"') <= to_date(?,'"+CLPConstantes.DATE_PATTERN+"')");
			params.add(finFechaVentaID);
		}
		
		if(StringUtils.isNotBlank(dePlacaID)){
			query.append(" and trim(upper(venta.de_placa)) like upper(?)");
			params.add("%"+dePlacaID.trim()+"%");
		}
		
		if(StringUtils.isNotBlank(vaPrecioVentaIniID)){
			query.append(" and venta.va_precio_venta >= ? ");
			params.add(vaPrecioVentaIniID);
		}
		
		if(StringUtils.isNotBlank(vaPrecioVentaFinID)){
			query.append(" and venta.va_precio_venta <= ? ");
			params.add(vaPrecioVentaFinID);
		}
		
		if(StringUtils.isNotBlank(stOnlineID) && !stOnlineID.equals("-1")){
			query.append(" and venta.st_online = ? ");
			params.add(stOnlineID);
		}
		
		if(StringUtils.isNotBlank(stVentaID) && !stVentaID.equals("-1")){
			query.append(" and venta.st_venta = ? ");
			params.add(stVentaID);
		}		
		
		query.append(" group by ");
		query.append(" 	venta.id,");
		query.append(" venta.co_recibo,");
		query.append(" venta.co_code_estacion,");
		query.append(" estacion.de_estacion,");
		query.append(" venta.de_placa,");
		query.append(" venta.co_codigo_tarjeta_persona ,");
		query.append(" TO_CHAR(CAST(venta.da_fecha_venta AS DATE), 'dd/MM/yyyy'),");
		query.append(" TO_CHAR(CAST(venta.da_fecha_creacion AS DATE), 'dd/MM/yyyy'),");
		query.append(" venta.va_precio_venta,");
		query.append(" venta.st_venta,");
		query.append(" venta.st_online,");
		query.append(" trim(venta.co_serie)");
		query.append(" ||' - '");
		query.append(" || trim(venta.co_recibo)");
		query.append(" ||' - '");
		query.append(" ||trim(venta.co_code_estacion)");
		query.append(" order by venta.id desc ");
		
		query.append(" ) slct WHERE rownum <= ").append(maxResults);
		
		if(firstResult > 0){
			query.append(" ) WHERE rownum_ > ").append(firstResult);
		}
		
		System.out.println("*** VentaDaoImpl.buscarVentas() --> "+query.toString());
		
		ClpmVenta bean = null;
		List<ClpmVenta> listBean = new ArrayList<ClpmVenta>();
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		
		if(params.size() > 0){
			list = jdbcTemplate.queryForList(query.toString(), params.toArray());
		}else{
			list = jdbcTemplate.queryForList(query.toString());
		}
		
		if(ValidationUtil.validateList(list)){
			for (Map<String, Object> map : list) {
				
				bean = new ClpmVenta();
				bean.setId(new Long(map.get("id").toString()));
				
				if(map.get("coRecibo") != null){
					bean.setCoRecibo(map.get("coRecibo").toString());
				}
				
				if(map.get("coCodeEstacion") != null){
					bean.setCoCodeEstacion(map.get("coCodeEstacion").toString());
				}
				
				if(map.get("deEstacion") != null){
					bean.setDeEstacion(map.get("deEstacion").toString());
				}
				
				if(map.get("dePlaca") != null){
					bean.setDePlaca(map.get("dePlaca").toString());
				}
				
				if(map.get("coCodigoTarjetaPersona") != null){
					bean.setCoCodigoTarjetaPersona(map.get("coCodigoTarjetaPersona").toString());
				}
				
				if(map.get("fechaVenta") != null){
					bean.setFechaVenta(map.get("fechaVenta").toString());
				}
				
				if(map.get("fechaCreacion") != null){
					bean.setFechaCreacion(map.get("fechaCreacion").toString());
				}
				
				if(map.get("vaPrecioVenta") != null){
					bean.setVaPrecioVenta(new BigDecimal(map.get("vaPrecioVenta").toString()));
				}
				
				if(map.get("stVenta") != null){
					bean.setStVenta(map.get("stVenta").toString());
				}
				
				if(map.get("stOnline") != null){
					bean.setStOnline(map.get("stOnline").toString());
				}
				
				if(map.get("deVenta") != null){
					bean.setDeVenta(map.get("deVenta").toString());
				}
				
				listBean.add(bean);
			}
		}
		
		return listBean;
	}

	public int obtenerNumeroVentas(String[] filters) {

		String coClientePersona = "";
		String coEstacionID = "";
		String iniFechaVentaID = "";
    	String finFechaVentaID = "";
    	String dePlacaID = "";
    	String vaPrecioVentaIniID = "";
    	String vaPrecioVentaFinID = "";
    	String stOnlineID = "";
    	String stVentaID = "";
		
		if(filters != null && filters.length > 0){
			coClientePersona = filters[0] != null ? filters[0] : "";
			coEstacionID = filters[1] != null ? filters[1] : "";
			iniFechaVentaID = filters[2] != null ? filters[2] : "";
			finFechaVentaID = filters[3] != null ? filters[3] : "";
			dePlacaID = filters[4] != null ? filters[4] : "";
			vaPrecioVentaIniID = filters[5] != null ? filters[5] : "";
			vaPrecioVentaFinID = filters[6] != null ? filters[6] : "";
			stOnlineID = filters[7] != null ? filters[7] : "";
			stVentaID = filters[8] != null ? filters[8] : "";
		}
		
		List<Object> params = new ArrayList<Object>();
		StringBuffer query = new StringBuffer();
		
		query.append(" 	select ");
		query.append(" 	COUNT(distinct venta.id) ");
		
		query.append(" from clpm_venta venta ");		
		query.append(" left join clpb_estacion estacion on estacion.co_codigo_cofide = venta.co_code_estacion ");
		
		query.append(" where venta.clpb_cliente_persona = ").append(coClientePersona);
		query.append(" and venta.co_codigo_tarjeta_persona is not null ");
		query.append(" and venta.de_placa not in (");
		query.append(" 		select de_placa from clpb_vehiculo ");
		query.append("		where st_vehiculo = '"+CLPConstantes.ST_VERDADERO+"'");
		query.append("		and st_excluido_control_fraude = '"+CLPConstantes.ST_VERDADERO+"') ");
		
		
		if(StringUtils.isNotBlank(coEstacionID) && !coEstacionID.equals("-1")){
			query.append(" and estacion.id = ? ");
			params.add(coEstacionID);
		}
		
		if(StringUtils.isNotBlank(iniFechaVentaID)){
			query.append(" and to_date(to_char(venta.da_fecha_venta,'"+CLPConstantes.DATE_PATTERN+"'),'"+CLPConstantes.DATE_PATTERN+"') >= to_date(?,'"+CLPConstantes.DATE_PATTERN+"')");
			params.add(iniFechaVentaID);
		}
		
		if(StringUtils.isNotBlank(finFechaVentaID)){
			query.append(" and to_date(to_char(venta.da_fecha_venta,'"+CLPConstantes.DATE_PATTERN+"'),'"+CLPConstantes.DATE_PATTERN+"') <= to_date(?,'"+CLPConstantes.DATE_PATTERN+"')");
			params.add(finFechaVentaID);
		}
		
		if(StringUtils.isNotBlank(dePlacaID)){
			query.append(" and trim(upper(venta.de_placa)) like upper(?)");
			params.add("%"+dePlacaID.trim()+"%");
		}
		
		if(StringUtils.isNotBlank(vaPrecioVentaIniID)){
			query.append(" and venta.va_precio_venta >= ? ");
			params.add(vaPrecioVentaIniID);
		}
		
		if(StringUtils.isNotBlank(vaPrecioVentaFinID)){
			query.append(" and venta.va_precio_venta <= ? ");
			params.add(vaPrecioVentaFinID);
		}
		
		if(StringUtils.isNotBlank(stOnlineID) && !stOnlineID.equals("-1")){
			query.append(" and venta.st_online = ? ");
			params.add(stOnlineID);
		}
		
		if(StringUtils.isNotBlank(stVentaID) && !stVentaID.equals("-1")){
			query.append(" and venta.st_venta = ? ");
			params.add(stVentaID);
		}

		int rows = 0;		
		if(params.size() > 0){
			rows = jdbcTemplate.queryForInt(query.toString(), params.toArray());
		}else{
			rows = jdbcTemplate.queryForInt(query.toString());
		}
		
		return rows;
	}
}
